"""
    input_data.py: 读取训练数据
"""
# import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import os

def get_files(file_dir):

    cats = []           # 存放是猫的图片路径地址
    label_cats = []     # 对应猫图片的标签
    dogs = []           # 存放是猫的图片路径地址
    label_dogs = []     # 对应狗图片的标签

    for file in os.listdir(file_dir):     # file就是要读取的图片带后缀的文件名
        name = file.split(sep='.')
        if name[0] == 'cat':              # name[0]获取图片名
            cats.append(file_dir + file)
            label_cats.append(0)          # 并且对应的label_cats添加0标签 （这里记作：0为猫，1为狗）
        else:
            dogs.append(file_dir + file)
            label_dogs.append(1)          # 注意：这里添加进的标签是字符串格式，后面会转成int类型

    image_list = np.hstack((cats, dogs))               # 在水平方向平铺合成一个行向量，即两个数组的拼接
    label_list = np.hstack((label_cats, label_dogs))
    temp = np.array([image_list, label_list])
    temp = temp.transpose()
    np.random.shuffle(temp)

    image_list = list(temp[:, 0])
    label_list = list(temp[:, 1])
    label_list = [int(float(i)) for i in label_list]  # 把标签列表转化为int类型（用列表解析式迭代，相当于精简的for循环）

    return image_list, label_list


def get_batch(image, label, image_W, image_H, batch_size, capacity):
    image = tf.cast(image, tf.string)   # 将列表转换成tf能够识别的格式
    label = tf.cast(label, tf.int32)

    input_queue = tf.train.slice_input_producer([image, label])   # 生成队列(牵扯到线程概念，便于batch训练), 将image和label传入

    label = input_queue[1]
    image_contents = tf.read_file(input_queue[0])
    image = tf.image.decode_jpeg(image_contents, channels=3)   # 使用JPEG的格式解码从而得到图像对应的三维矩阵。

    image = tf.image.resize_images(image, [image_H, image_W], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
    image = tf.cast(image, tf.float32)
    image = tf.image.per_image_standardization(image)   # 图片标准化处理，加速神经网络的训练

    image_batch, label_batch = tf.train.batch([image, label],
                                              batch_size=batch_size,
                                              num_threads=64,
                                              capacity=capacity)       # 用来设置队列中元素的最大数量

    return image_batch, label_batch